# -*- coding:UTF-8 -*-
'''
Created on 2017年8月20日

@author: dayu
'''

class JGListCreator(object):
    '''
    classdocs
    '''


    def __init__(self):
        '''
        Constructor
        '''
        self.serialization = []
        
    def first(self):
        "第一个序列"
        return self.serialization[0]
    def last(self):
        "最后一个序列"
        return self.serialization[-1]
    def next(self, n):
        "某个序列之后的一个"
        return self.serialization[n + 1]
    
    def create(self, l, ret = []):
        '''
        根据给定的列表生成九宫格序列数PPP
        l 序列中包含的数
        ret 跟本函数没有太多关系，用于迭代
        '''
        l.sort()
        if len(l) == 1:
            ret.append(l.pop())
            self.serialization.append(ret)
#             print ret
            # print '\n'
            return
        for nn in l:
            subl = l[:]
            retl = ret[:]
            retl.append(nn)
            subl.remove(nn)
            self.create(subl,retl)

    def ridWhenCreating(self, l, ret = [], ridMap = {}):
        '''
        根据给定的列表生成九宫格序列数PPP
        l 序列中包含的数
        ret 跟本函数没有太多关系，用于迭代
        ridMap 记录每一列中已经被使用过的数字
        '''
        l.sort()
        if len(l) == 1:
            ret.append(l.pop())
            self.serialization.append(ret)
            return
        for nn in l:
            subl = l[:]
            retl = ret[:]
            pos = len(retl)
            
            ridList = ridMap.get(pos) 
            if nn in ridList : # 阻止在这一列中已经使用过的数再次使用
                continue
            retl.append(nn)
            subl.remove(nn)
            self.create(subl,retl)

    def hasFixNumbers(self, posMap):
        '''
        入口函数
        '''
        numList = [1,2,3,4,5,6,7,8,9]
        for n in posMap :
            numList.remove(n)
        del self.serialization[:]
        self.create(numList)
        for s in self.serialization :
            for n in posMap :
                s.insert(posMap.get(n), n)  # 在固定位置上插入已经给定的数字
   
    def ridSome(self, posMap):
        '''
        剔除位置已经被占用的序列
        posMap 已经被占用的数和位置
        '''
        delList = self.serialization[:]
        for s in delList :
            for n in posMap :
                if s[posMap.get(n)] == n :
                    self.serialization.remove(s)
                    print 'rid:', s
         
    def verify(self, nine):
        '''
        校验一个列表是否为九宫格序列
        '''
        if len(nine) != 9 :
            return False
        normal = [1,2,3,4,5,6,7,8,9]
        for n in nine :
            if n not in normal :
                return False
            else :
                normal.remove(n)
        if len(normal) == 0 :
            return True
        else :
            return False
         
   